home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / inventor / www / workarounds / DetailLeak1.1.C < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  2.0 KB  |  75 lines

  1. #include <Inventor/SoPath.h>
  2. #include <Inventor/actions/SoSearchAction.h>
  3. #include <Inventor/nodes/SoSeparator.h>
  4. #include <Inventor/nodes/SoCoordinate3.h>
  5. #include <Inventor/nodes/SoNormal.h>
  6. #include <Inventor/SoDetail.h>
  7.  
  8. //
  9. // The SoVertexShapeDetail::getLastPropertyNode in Inventor 1 creates
  10. // a SearchAction but fails to delete it.  This causes
  11. // a large memory leak (the searchAction, all of the paths it finds,
  12. // and all of the nodes on those paths will never be deleted) and will
  13. // cause the application to slow down because of the extra paths.
  14. //
  15. // To fix this, compile this file into a .o and then link
  16. // the .o before -lInventor.  The linker will give a warning about
  17. // multiply defined symbols; that is normal and expected.
  18. //
  19.  
  20.  
  21. ////////////////////////////////////////////////////////////////////////
  22. //
  23. // Description:
  24. //  Returns the node of the given type that affects the shape that
  25. //  this detail's path leads to. The passed property node should
  26. //  be one that does not accumulate such as, oh, gosh,
  27. //  maybe a Normal or a Coordinate3 node, because we look
  28. //  for the last (and hence current) one.
  29. //
  30. //
  31. // Use: private
  32.  
  33. SoNode *
  34. SoVertexShapeDetail::getLastPropertyNode(SoType typeId) const
  35. //
  36. ////////////////////////////////////////////////////////////////////////
  37. {
  38. #ifdef DEBUG    
  39.     if (path == NULL) {
  40.      fprintf( stderr, "SoVertexShapeDetail::getLastPropertyNode - " );
  41.      fprintf( stderr, "path to shape is NULL\n" );
  42.      return NULL;
  43.     }
  44. #endif
  45.  
  46.     SoNode *result;
  47.     
  48.     if (path->getTail()->isOfType(typeId)) {
  49.     // path already leads to a node of given type, so just return it
  50.     result = path->getTail();
  51.     }
  52.     else {
  53.     // Apply a search action to the path, and look
  54.     // for the _last_ node of the requested type
  55.     
  56.     SoSearchAction sa;
  57.     sa.setType(typeId);
  58.     sa.setFindAll(TRUE);
  59.     sa.apply(path);
  60.  
  61.     SoPathList paths = sa.getPaths();
  62.     
  63.     if (paths.length() == 0) {
  64.         // nothing found
  65.         result = NULL;
  66.     }
  67.     else {
  68.         // return the last one found
  69.         result = paths[paths.length() - 1]->getTail();
  70.     }
  71.     }
  72.  
  73.     return result;
  74. }
  75.